#include "estructuras.h"
#include <time.h>

int main(int argc, char *argv[])
{
	srand(time(NULL));
	char mensaje[500];
	m_kanbanproduccion msg_kproduccion;
	m_kanbanentreprocesos msg_kprocesos;

	int producidos, fentregar;

	int colaE, colaI;
	int pid_armado;
	key_t clave_colaE, clave_colaI;

	clave_colaE = ftok(DIRECTORIO, COLA_EXTERNA);
	clave_colaI = ftok(DIRECTORIO, COLA_INTERNA);

	if ( (colaE = msgget(clave_colaE, 0666)) < 0 )		/* Obtengo el ID de la cola */
	{
		sprintf(mensaje, "Error al obtener el ID de la cola Externa\n");
		write(fileno(stdout), mensaje, strlen(mensaje));
		exit(-1);
	}
	
	if ( (colaI = msgget(clave_colaI, 0666)) < 0 )		/* Obtengo el ID de la cola */
	{
		sprintf(mensaje, "Error al obtener el ID de la cola Interna\n");
		write(fileno(stdout), mensaje, strlen(mensaje));
		exit(-1);
	}

	while(1)
	{
		/* Recibo Kanban de Produccion de Armado */
		if ( msgrcv(colaI, (m_kanbanproduccion *) &msg_kproduccion, sizeof(m_kanbanproduccion), MSG_CABINA_PROD, 0) < 0 )
		{
			sprintf(mensaje, "Cabina: Error al recibir el Kanban de Produccion de Armado\n");
			write(fileno(stdout), mensaje, strlen(mensaje));

			exit(-1);
		}

		printf("+--------------------------------------+\n");
		printf("| Cabina: Recibi KProduccion de Armado |\n");
		printf("+--------------------------------------+\n");
		printf("Sector: %d\n", msg_kproduccion.sector);
		printf("Cantidad de cabinas a producir: %d\n", msg_kproduccion.cantVehiculos);
		printf("\n");

		/* Me guardo el PID de armado para poder contestarle */
		pid_armado = msg_kproduccion.sector;

		/* La cantidad de partes que voy a tener que producir */
		fentregar = msg_kproduccion.cantVehiculos;

		/* Armo el nuevo Kanban de Produccion que voy a mandar */
		msg_kproduccion.sectorSiguiente = msg_kproduccion.sector;
		msg_kproduccion.sector = getpid();

		/* Mando los Kanban de Produccion a los 3 sectores para que sepan cuanto tienen que producir */

		printf("Envio KProd a Floor\n");
		/* 1. Floor */
		msg_kproduccion.mtype = MSG_FLOOR_PROD;
		if ( msgsnd(colaI, (m_kanbanproduccion *) &msg_kproduccion, sizeof(m_kanbanproduccion), 0) < 0 )
		{
		        sprintf(mensaje, "Cabina: Error al enviar el Kanban de Produccion Floor\n");
			write(fileno(stdout), mensaje, strlen(mensaje));
	         	exit(-1);
		}

		printf("Envio KProd a Spider\n");
		/* 2. Spider */
		msg_kproduccion.mtype = MSG_SPIDER_PROD;
		if ( msgsnd(colaI, (m_kanbanproduccion *) &msg_kproduccion, sizeof(m_kanbanproduccion), 0) < 0 )
		{
		        sprintf(mensaje, "Cabina: Error al enviar el Kanban de Produccion Spider\n");
			write(fileno(stdout), mensaje, strlen(mensaje));
	         	exit(-1);
		}

		printf("Envio KProd a Frame\n");
		/* 3. Frame */
		msg_kproduccion.mtype = MSG_FRAME_PROD;
		if ( msgsnd(colaI, (m_kanbanproduccion *) &msg_kproduccion, sizeof(m_kanbanproduccion), 0) < 0 )
		{
		        sprintf(mensaje, "Cabina: Error al enviar el Kanban de Produccion Frame\n");
			write(fileno(stdout), mensaje, strlen(mensaje));
	         	exit(-1);
		}

		/* Por cada una de las partes que tengo que producir.. */
		for (producidos=1; producidos <= fentregar; producidos++)
		{
			printf("Espero a que Armado tenga lugar para recibir una cabina\n");
			/* Espero a que Armado me diga que tiene espacio para recibir */
			if ( msgrcv(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), MSG_CABINA_PROC, 0) < 0 )
			{
				sprintf(mensaje, "Error al encolar el pedido en PaintShop EntreProcesos\n");
				write(fileno(stdout), mensaje, strlen(mensaje));

				exit(-1);
			}

				printf("+------------------------------------------------+\n");
				printf("| Cabina: Recibi de Armado Kanban entre procesos |\n");
				printf("+------------------------------------------------+\n");
				printf("Sector: %ld\n", msg_kprocesos.nroSector);
				printf("nroVehiculo: %ld\n", msg_kprocesos.nroVehiculo);
				printf("codParte: %ld\n", msg_kprocesos.codParte);
				printf("nroOrden: %ld\n", msg_kprocesos.nroOrden);
				printf("\n");

				/* Solicito las partes a los 3 sectores de los cuales dependo */
				/* 1. Floor */
				printf("Solicitando floor ...\n");
				printf("\n");

				msg_kprocesos.mtype=MSG_FLOOR_PROC;

				if ( msgsnd(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), 0) < 0 )
				{
					sprintf(mensaje, "Cabina: Error al enviar Kanban entre procesos a Floor\n");
					write(fileno(stdout), mensaje, strlen(mensaje));
					exit(-1);
				}

				/* 2. Spider */
				printf("Solicitando spider ...\n");
				printf("\n");

				msg_kprocesos.mtype=MSG_SPIDER_PROC;

				if ( msgsnd(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), 0) < 0 )
				{
					sprintf(mensaje, "Cabina: Error al enviar Kanban entre procesos a Spider\n");
					write(fileno(stdout), mensaje, strlen(mensaje));
					exit(-1);
				}

				/* 3. Frame */
				printf("Solicitando frame ...\n");
				printf("\n");

				msg_kprocesos.mtype=MSG_FRAME_PROC;

				if ( msgsnd(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), 0) < 0 )
				{
					sprintf(mensaje, "Cabina: Error al enviar Kanban entre procesos a Frame\n");
					write(fileno(stdout), mensaje, strlen(mensaje));
					exit(-1);
				}

				/*
					Espero de cada una de las partes a las cuales les solicite alguna parte que me la
					devuelvan para que pueda trabajar y pasarla a la siguiente etapa.
				*/
				/* 1. Floor */
				if ( msgrcv(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), MSG_CABINA_FLOOR, 0) < 0 )
				{
					sprintf(mensaje, "Cabina: Error al recibir Kanban entre Procesos Floor\n");
					write(fileno(stdout), mensaje, strlen(mensaje));
					exit(-1);
				}
				printf("+--------------+\n");
				printf("| Recibi Floor |\n");
				printf("+--------------+\n");
				printf("%d de %d\n", producidos, fentregar);
				printf("nroVehiculo: %d", msg_kprocesos.nroVehiculo);
				printf("\n");

				/* 2. Spider */
				if ( msgrcv(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), MSG_CABINA_SPIDER, 0) < 0 )
				{
					sprintf(mensaje, "Cabina: Error al recibir Kanban entre Procesos Spider\n");
					write(fileno(stdout), mensaje, strlen(mensaje));
					exit(-1);
				}
				printf("+---------------+\n");
				printf("| Recibi Spider |\n");
				printf("+---------------+\n");
				printf("%d de %d\n", producidos, fentregar);
				printf("nroVehiculo: %d", msg_kprocesos.nroVehiculo);
				printf("\n");

				/* 3. Frame */
				if ( msgrcv(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), MSG_CABINA_FRAME, 0) < 0 )
				{
					sprintf(mensaje, "Cabina: Error al recibir Kanban entre Procesos Spider\n");
					write(fileno(stdout), mensaje, strlen(mensaje));
					exit(-1);
				}
				printf("+--------------+\n");
				printf("| Recibi Frame |\n");
				printf("+--------------+\n");
				printf("%d de %d\n", producidos, fentregar);
				printf("nroVehiculo: %d", msg_kprocesos.nroVehiculo);
				printf("\n");


				printf("Soldando partes ...");
				sleep(rand()%7);
				printf("\n");

				msg_kprocesos.mtype = MSG_ARMADO_CABINA;
				printf("Envio KanbanEntreProcesos a %d\n", pid_armado);
				printf("\n");

				if ( msgsnd(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), 0) < 0 )
				{
					sprintf(mensaje, "Error al enviar Kanban entre Procesos Armado\n");
					write(fileno(stdout), mensaje, strlen(mensaje));

					exit(-1);
				}
		} /* Fin for */
	} /* Fin while(1) */
 return 0;
}
